/**********************************************************      
  
 * 类名称：PolestarGroupSourceFactory   
 * 类描述：   
 * 创建人：夏鸿鹏 
 * 创建时间：2017年11月27日 下午1:20:20   
 * 修改备注：   
 *   
 **********************************************************/
package com.wuuxiang.polestar.core.spring;

import com.google.common.base.Preconditions;
import com.wuuxiang.polestar.core.ConfigGroup;
import com.wuuxiang.polestar.core.room.RoomName;
import com.wuuxiang.utils.des.DESUtils;
import com.wuuxiang.utils.string.StrUtils;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySources;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

public class PolestarGroupSourceFactory {

	private static List<String> encryptPropNamesList;
	/** 分库db正则表达式 */
	private static final String SHARING_DB_PATTERN = "^sharing_db_.*$";
	static {
		encryptPropNamesList = new ArrayList<String>();
		encryptPropNamesList.add("crmurl");
		encryptPropNamesList.add("crmusername");
		encryptPropNamesList.add("crmpassword");
		encryptPropNamesList.add("crmurlread");
		encryptPropNamesList.add("crmusernameread");
		encryptPropNamesList.add("crmpasswordread");
		encryptPropNamesList.add("o2ourl");
		encryptPropNamesList.add("o2ousername");
		encryptPropNamesList.add("o2opassword");
		encryptPropNamesList.add("mysqlurl");
		encryptPropNamesList.add("mysqlusername");
		encryptPropNamesList.add("mysqlpassword");
		encryptPropNamesList.add("o2omysqlusername");
		encryptPropNamesList.add("o2omysqlpassword");
	}

	public static PropertySources create(ConfigGroup... configGroups) {
		Preconditions.checkNotNull(configGroups);
		final MutablePropertySources sources = new MutablePropertySources();
		Pattern pattern = Pattern.compile(SHARING_DB_PATTERN);
		for (ConfigGroup configGroup : configGroups) {
			if (configGroup != null) {
				// 进行解密
				for (String key : configGroup.keySet()) {
					if (encryptPropNamesList.contains(key) || pattern.matcher(key).find()) {
						configGroup.put(key, DESUtils.getDecryptString(configGroup.get(key)));
					}
					if ("group.name".equals(key)) {
						// 如果docker容器传入机房配置环境变量则重新设置机房名称
						if (StrUtils.isNotBlank(RoomName.getRoom())) {
							// 覆盖从配置中心读取的机房名称
							configGroup.put("group.name", RoomName.getRoom());
						}
					}
				}
				sources.addLast(new ConfigGroupResource(configGroup));
			}
		}
		return sources;
	}

	/**
	 * ********************************************************<br>
	 * 方法说明： 添加springboot支持 <br>
	 * 参数： @param sources 参数： @param configGroups <br>
	 * 返回值： void <br>
	 * 创建人：夏鸿鹏 <br>
	 * 创建时间：2017年11月21日 下午2:15:57 <br>
	 * 修改备注： <br>
	 *********************************************************
	 * 
	 */
	public static void create(MutablePropertySources sources, ConfigGroup... configGroups) {
		Preconditions.checkNotNull(configGroups);
		Pattern pattern = Pattern.compile(SHARING_DB_PATTERN);
		for (ConfigGroup configGroup : configGroups) {
			if (configGroup != null) {
				// 进行解密
				for (String key : configGroup.keySet()) {
					if (encryptPropNamesList.contains(key) || pattern.matcher(key).find()) {
						configGroup.put(key, DESUtils.getDecryptString(configGroup.get(key)));
					}
					if ("group.name".equals(key)) {
						// 如果docker容器传入机房配置环境变量则重新设置机房名称
						if (StrUtils.isNotBlank(RoomName.getRoom())) {
							// 覆盖从配置中心读取的机房名称
							configGroup.put("group.name", RoomName.getRoom());
						}
					}
				}
				sources.addLast(new ConfigGroupEnumerableResource(configGroup));
			}
		}
	}

}
